recordset提供了对List+Map结构的数据压缩、解压处理,并提供排序、筛选、搜索等常用功能。
在服务端使用RecordSet对象对List+Map结构的数据进行压缩处理。代码如下
RecordSet rs = new RecordSet(list); rs.setPerjson(false); // 这行必须加 com.longtu.framework.rpcfw.mapper.ObjectReader reader = new com.longtu.framework.rpcfw.mapper.ObjectReader(rs); String r = reader.getObjectValue();
以单位信息为例传统的List+Map结构生成的json数据如下;
[{'code':'101','name':'省厅'},{'code':'102','name':'预算处'},{'code':'103','name':'国库处'},{'code':'104','name':'有关部门'}]
这种格式中字段名code,name重复多次,增加网络传输的开销。
recordset数据集采用数组保存字段名,二维数组保存数据,通过位置与字段名匹配的方式在前台还原成对象。使用recordset对象生成的json数据如下:
new Ext.lt.recordset({columns:['code','name'],datas:[['101','省厅'],['102','预算处'],['103','国库处'],['104','有关部门']]})
当数据中存在大量重复数据时,recordset会通过别名方式进一步压缩数据,例如凭证信息:
[{'billcode':'10001','expfunc':'201-功能分类'},{'billcode':'10002','expfunc':'201-功能分类'},{'billcode':'10003','expfunc':'201-功能分类'},{'billcode':'10004','expfunc':'201-功能分类'}]
压缩后:
function(){var $1='201-功能分类';return new Ext.lt.recordset({columns:['billcode','expfunc'],datas:[['10001',$1],['10002',$1],['10003',$1],['10004',$1]]})}();
| 参数名 | 数据类型 | 说明 |
|---|---|---|
| version | String | 对象版本号,缺省为1.0,目前最新版本为3.0 |
| type | 对象类型 | 值集为recordset |
| columns | 数组 | 数据集的列名 |
| datas | 二维数组 | 数据集的数据,数据的顺序必须与列数据保持一致 |
返回数组长度
rs.size()
向数据集中指定位置追加数据,当参数为数组类型时会将数组内的元素取出加到到数据集中,方法第二个参数为插入数据的位置从0开始。如果第二个参数为空则将数据追加到数据集的末尾
rs.setData({code:'201',name:'单位'},2)
向数据集中的指定位置追加数据
rs.addData({code:'201',name:'单位'},0)
从数据集中获取数据
rs.getData(0)
获取执行位置对象的属性值
rs.getData(0,'name')
获取列名的数组
rs.getColNames
循环数据集,参数为处理函数,开始位置,结束位置。开始位置为空表示从数据集起始位置开始,结束位置为空表示循环到数据集结尾
rs.each(function(d){},0,3)
按照指定属性排序,排序算法采用快速排序法。第二个参数控制升序还是降序,默认降序。recordset实例化之后会在对象上添加_locationposition属性,作为数据的默认顺序。如果直接调用sort方法,不指定字段名则按照locationposition属性排序
rs.sort('code',false)
清除数据集内容
rs.clear()
从数据集的指定位置开始删除数据,参数为判断删除的函数,返回true的数据将从数据集中删除
rs.delData(function(rs){return true},3)
合并两个数据集和字段,并将recordset1插入到指定位置
rs.join(recordset1,2)
导出成标准的list+map的JSON格式
rs.toJSON()
转换为{columns:[],datas:[[],[]]}形式的字符串
rs.toArrayJSON()
设置过滤条件,设置格式为{key:string/number/array,…}。设置过滤条件后,只能从结果集中获取到符合过滤条件的数据。
rs.setFilter({code:'201',name:['单位1','单位2']})
清除数据过滤条件
rs.clearFilter()
根据过滤条件查询数据集中的数据,返回值为数组,过滤条件格式为{key:string/number/array[number/string],…},返回数组,默认返回一个空数组
rs.query({code:'201',name:['单位1','单位2']})
从结果集中选择数据,fn函数为过滤函数,fn函数的参数为遍历的数据。select方法返回,fn函数判断为true的数据,返回对象类型为recordset
rs.select(function(d){return true})
返回记录每一列最大字符数的数组,汉字按两个字符处理
rs.getMaxColDataLength()
返回指定列数据中最大字符数,汉字按两个字符处理
rs.getMaxLength('code')
将RecordSet数据集转换为List+Map结构的数据集
rs.toArray()
设置合计行的位置,指定的合计行不参与排序 rs.setTotal(0)
从结果集中删除指定行,可以指定行号或通过数组同时删除多行 rs.delRow(1), rs.delRow([2,5,18])
| toArray接口 | |
|---|---|
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技']]});
$('toArrayTest').innerText=Object.toJSON(rs.toArray());
|
|
| sort接口 | |
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['102','国防'],['103','科技'],['101','一般预算']]});
rs.sort('code',true);
$('sortTest').innerText=Object.toJSON(rs.toArray());
|
|
| join接口 | |
var rs1=new Ext.lt.recordset({columns:['code','name'],datas:[['102','国防'],['103','科技'],['101','一般预算']]});
var rs2=new Ext.lt.recordset({columns:['code','value'],datas:[['104','农业'],['105','教育'],['106','卫生']]});
rs1.join(rs2)
$('joinTest').innerText=Object.toJSON(rs1.getColNames())+'\n'+Object.toJSON(rs1.toArray());
|
|
| query接口 | |
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技']]});
$('queryTest').innerText=Object.toJSON(rs.query({code:['101','103']}))+'\n'+Object.toJSON(rs.query({code:'103'}));
|
|
| addData接口 | |
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技']]});
rs.addData({'code':'104',name:'农业'},1);
rs.addData([{'code':'105',name:'教育'},{'code':'106',name:'卫生'}]);
$('addDataTest').innerText=Object.toJSON(rs.toArray());
|
|
| setFilter接口 | |
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技']]});
rs.setFilter({code:['101','103']});
$('setFilterTest').innerText=Object.toJSON(rs.toArray());
|
|
| setTotal接口 | |
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技']]});
rs.setTotal(0);
rs.sort('code',false);
$('setTotalTest').innerText=Object.toJSON(rs.toArray());
|
|
| 1.4数据结构测试 | |
var rs=new function(){return new Ext.lt.recordset({ver:"1.4",compress:1,columns:["10000","10003","10001","10002"],datas:[{10000:"0\\10000",10003:"0\\10003",10001:"0\\10001",10002:"0\\10002"},{10000:"1\\10000",10003:"1\\10003",10001:"1\\10001",10002:"1\\10002"},{10000:"2\\10000",10003:"2\\10003",10001:"2\\10001",10002:"2\\10002"},{10000:"3\\10000",10003:"3\\10003",10001:"3\\10001",10002:"3\\10002"},{10000:"4\\10000",10003:"4\\10003",10001:"4\\10001",10002:"4\\10002"},{10000:"5\\10000",10003:"5\\10003",10001:"5\\10001",10002:"5\\10002"},{10000:"6\\10000",10003:"6\\10003",10001:"6\\10001",10002:"6\\10002"},{10000:"7\\10000",10003:"7\\10003",10001:"7\\10001",10002:"7\\10002"},{10000:"8\\10000",10003:"8\\10003",10001:"8\\10001",10002:"8\\10002"},{10000:"9\\10000",10003:"9\\10003",10001:"9\\10001",10002:"9\\10002"}],ml:[7,7,7,7]})};
$('recordsetcompress1').innerText=Object.toJSON(rs.toArray());
var rs=new function(){return new Ext.lt.recordset({ver:"1.4",compress:2,columns:["10000","10003","10001","10002"],datas:[["0\\10000","0\\10003","0\\10001","0\\10002"],["1\\10000","1\\10003","1\\10001","1\\10002"],["2\\10000","2\\10003","2\\10001","2\\10002"],["3\\10000","3\\10003","3\\10001","3\\10002"],["4\\10000","4\\10003","4\\10001","4\\10002"],["5\\10000","5\\10003","5\\10001","5\\10002"],["6\\10000","6\\10003","6\\10001","6\\10002"],["7\\10000","7\\10003","7\\10001","7\\10002"],["8\\10000","8\\10003","8\\10001","8\\10002"],["9\\10000","9\\10003","9\\10001","9\\10002"]],ml:[7,7,7,7]})}
$('recordsetcompress2').innerText=Object.toJSON(rs.toArray());
var rs=new function(){var N=null;return new Ext.lt.recordset({ver:"1.4",compress:1,columns:["10000","10003","10001","10002"],datas:[{10000:N,10003:"0\\",10001:"0\\",10002:"0\\"},{10000:N,10003:"1\\",10001:"1\\",10002:"1\\"},{10000:N,10003:"2\\",10001:"2\\",10002:"2\\"},{10000:N,10003:"3\\",10001:"3\\",10002:"3\\"},{10000:N,10003:"4\\",10001:"4\\",10002:"4\\"},{10000:N,10003:"5\\",10001:"5\\",10002:"5\\"},{10000:N,10003:"6\\",10001:"6\\",10002:"6\\"},{10000:N,10003:"7\\",10001:"7\\",10002:"7\\"},{10000:N,10003:"8\\",10001:"8\\",10002:"8\\"},{10000:N,10003:"9\\",10001:"9\\",10002:"9\\"}],ml:[0,2,2,2]})}
$('recordsetcompress3').innerText=Object.toJSON(rs.toArray());
|
|
| delRow接口测试 | |
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技'],['104','农业'],['105','军事']]});
rs.delRow(0);
$('recordsetdelrow1').innerText=Object.toJSON(rs.toArray());
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技'],['104','农业'],['105','军事']]});
rs.delRow([1,4]);
$('recordsetdelrow2').innerText=Object.toJSON(rs.toArray());
var rs=new Ext.lt.recordset({columns:['code','name'],datas:[['101','一般预算'],['102','国防'],['103','科技'],['104','农业'],['105','军事']]});
rs.delRow([5]);
$('recordsetdelrow3').innerText=Object.toJSON(rs.toArray());
|
|
| toJSON性能测试 | |
var cols=[],datas=[],log=[];
for(var i=0;i<20;i++){cols.push('col'+i);}
for(var j=0;j<10000;j++){
var d=[];
for(var i=0;i<20;i++) d.push('line'+j+'col'+i);
datas.push(d);
}
var rs=new Ext.lt.recordset({columns:cols,datas:datas});
log.push('转换',rs.size(),'条数据的recordset对象耗时');
var start=new Date();
var json=rs.toJSON();
log.push((new Date()-start)+'ms'+(json.length)+'字节');
try{
eval('('+json+')');
}
catch(e){
log.push('验证转换结果失败');
}
$('recordsettojson').innerHTML=log.join('');
|
|
| toArrayJSON性能测试 | |
var cols=[],datas=[],log=[];
for(var i=0;i<20;i++){cols.push('col'+i);}
for(var j=0;j<10000;j++){
var d=[];
for(var i=0;i<20;i++) d.push('line'+j+'col'+i);
datas.push(d);
}
var rs=new Ext.lt.recordset({columns:cols,datas:datas});
log.push('转换',rs.size(),'条数据的recordset对象耗时');
var start=new Date();
var json=rs2W.datas.toJSON();
log.push((new Date()-start)+'ms'+(json.length)+'字节');
try{
eval('('+json+')');
}
catch(e){
log.push('验证转换结果失败');
}
$('recordsettoarrayjson').innerHTML=log.join('');
|
|